package ar.uba.fi.tonyvaliente.documents;

/**
 * Representa un filtro generico para una consulta
 * sobre el indice invertido de documentos.
 * Permite obtener un iterador de resultados, es decir,
 * los IDs de documentos que pasan el filtro
 *
 * @author dmorello
 */
public abstract class DocumentFilter {
	
	/*
	 * Indica si el filtro esta negado, es decir
	 * si debe tomar los documentos que no cumplen
	 * la condicion y descartar los que si la cumplen
	 */
	private boolean negated;

	protected DocumentFilter(boolean negated) {
		this.negated = negated;
	}

	/**
	 * Devuelve el flag de filtro negado
	 * @return flag de filtro negado
	 */
	public boolean isNegated() {
		return negated;
	}

	/**
	 * Invierte el valor del flag de filtro negado
	 */
	public void invertNegatedFlag() {
		negated = !negated;
	}

	/**
	 * Devuelve un iterador que permite recorrer los
	 * resultados de aplicar el filtro a los documentos
	 * en el indice invertido.
	 * @return iterador de resultados del filtro
	 */
	public final ResultIterator getResultIterator() {
		// TODO: implementar!!
		int totalDocumentos = -1;
		ResultIterator it = createResultIterator(totalDocumentos);
		if (this.isNegated()) {
			it = new NegatedResultIterator(it);
		}
		return it;
	}
	
	protected abstract ResultIterator createResultIterator(int totalDocumentos);
}
